跳到主要内容

传统的关系型数据库(Traditional RDBMS Systems)

由 Michael Stonebraker 介绍

被选中的读物


Morton M. Astrahan, Mike W. Blasgen, Donald D. Chamberlin, Kapali P. Eswaran, Jim Gray, Patricia P. Griffiths, W. Frank King III, Raymond A. Lorie, Paul R. McJones, James W. Mehl, Gianfranco R. Putzolu, Irving L. Traiger, Bradford W. Wade, Vera Watson. System R: Relational Approach to Database Management. ACM Transactions on Database Systems, 1(2), 1976, 97-137.

Michael Stonebraker and Lawrence A. Rowe. The design of POSTGRES. SIGMOD, 1986.

David J. DeWitt, Shahram Ghandeharizadeh, Donovan Schneider, Allan Bricker, Hui-I Hsiao, Rick Rasmussen. The Gamma Database Machine Project. IEEE Transactions on Knowledge and Data Engineering, 2(1), 1990, 44-62.


在这个篇章当中我们将会介绍三种至为重要且广泛应用的数据库系统,在引言里面,我们会按照时间顺序讨论它们。

在大约1972年的时候,IBM研究中心的 Frank King 开始领导起 System R 项目。而那时距离 Ted Codd 的开创性论文,已经过去了18个月,许多研究人员们都期待有人挺身而出,为这篇文章构建一个原型,以验证其想法的正确与否。可惜的是,Ted 并没能得到这一项目的领导权限,而也正因如此,他另辟蹊径,尝试将自然语言的接口,移植到关系型数据库上面。由此 System R 项目迅速决定实现SQL,它在1972年[^2]由一种干净又紧凑的块结构语言,演变成一种本文当中描述的[^1]复杂结构语言。可以查阅[^4]来了解十年后的对 SQL 语言设计的技术评论。

System R 项目被组织为两个小组,也就是“下一半”("lower half")与“上一半”("upper half")。两个团队并不总是保持同步,举例来说,“下一半”曾经实现了“上一半”并不支持的连接功能。而为了捍卫“下一半”的决策,他们与IMS展开了竞争,也就自然而然地把他们包含在内。但是,“上一半”,根本就没有让优化器能够为这种结构工作。

而事务管理模块,则很有可能是整个项目保留至今的最大遗产,它的工作显然出自已故的 Jim Gray 之手。绝大多数由他做出的设计,依旧保留于今日的商业系统之中。而 System R 优化器则位居第二,它的基于代价的动态编程规划方法(The dynamic programming cost-based),依旧是优化器技术领域当中的黄金法则(gold standard)。

而就我而言,我对 System R 的最大不满在于,它们的团队似乎从来没有把 SQL 理顺。因此,在“上一半”简单地揉和 VASM 来表现DB2的时候,它们的语言级别,并没有发生改变。随即使得,所有这门编程语言的恼人特性,依旧保留到了今天。SQL将会像2020年的COBOL一样,成为一门令人烦恼,让人抱怨的语言。

而除此之外,我对于 System R 的第二大抱怨在于,他所依托的客户端连接外部接口(也就是今天的ODBC)。我认为,ODBC是整个星球上,最为糟糕的接口。为了执行一条单独的查询,一个应用程序,就需要打开一个数据库连接,设定一个游标(cursor),将其绑定到一条查询上面,然后才可以对数据记录展开单独的数据提取操作。是的,为了这样一条简单的查询,就要用上这么多高深莫测的代码。而看看 Ingres[^11]和Chris Date[^3]吧,它们有着简洁地多的嵌入式接口。而更进一步地来看,Pascal-R[^9]与Rigel[^8]同样也是把数据库功能包含进入一门编程语言的优雅的实现方法。而到了最近,在Linq[^7]与Ruby on Rails[^5]这两个新出来的接口身上,我们同样看到了干净的特定语言嵌入式接口的复兴(a resurgence of cleaner language-specific enbeddings)。

继 System R 之后,Jim Gray 加盟Tandem公司,展开对Non-stop SQL 数据库的研究,而 Kapali Eswaren 则展开了关系型数据库方面的落地工作。其它的绝大部分的团队成员,选择留在 IBM,并继续对包括R*在内的许多其它项目展开研究。

而我们选择的第二篇文章,则着重关注postgres。这个项目起步于1984年,在当时看来,继续使用学术项目 Ingres 的代码原型,明显毫无意义。对于 postgres 项目的历史回顾,可以参考[^10],而被我们引导到那篇论文之处的读者,可以对 postgres 发展历程当中的起起落落,有一个全面的把握与了解。

不过,在我的观点之中,postgres 的最重要的一点在于它的抽象类型系统(Abstract data type system, ADT system)。由用户自定义的数据类型与数据函数,被添加到了绝大多数的主流数据库系统中,而它们都是使用了 Postgres 中的模型。因此,这项被设计出来的特性,延续到了今天。Postgres 项目同样尝试了诸如时间旅行(Time Travel,该特性已经在 PostgreSQL 6.2 版本之后遭到了弃用,具体可以参考 PostgreSQL 6.3 的这部分描述,译者注)这样的特性,但是其工作效果,并不尽如人意。同时,我认为就像快速存储技术(faster stroage technology)改变了数据管理的生态那样,无覆盖存储技术(no-overwrite)也将会有其走上台前的一天(its day in the sun)。

我们同时必须注意的另外一件事情在于,Postgres 绝大多数的重要特性,都应当归功于其健壮而可靠的开源代码。这也是一个重要的开源社区模型,示范给业界,如何运营并且发展好一个开源项目。一支精心挑选好的志愿者队伍,在1990年的中期,开始接收伯克利大学的实现代码,并随即持续展开对其的发展工作。而促成开源代码工作模式成为如今业界的首选工作机制,Postgres与 4BSD Unix[^6]发挥了建设性的重要作用。

在伯克利大学持续研究的 Postgres 项目一直发展到了1992年,而此时商业公司 Illustra 开始支持商用代码。你可以查看[^10]以便于了解这前后的因果关系,即 Illustra 在市场上展开的实验。

除了抽象类型数据系统和开源代码分发工作模型之外,另外一个 Postgres 项目的关键特性在于,它培养了一代久经考验的数据库内核研究者,他们在人生后面的历程里,在一系列商用数据库内核的实现工作中,发挥了重要的作用。

而在这个篇章之中,我们所需要提及的第三种系统,就是 Gamma,它在1984~1990年之间,于威斯康星邦被建造出来。而在我的观念之中,Gamma 使得 shared-nothing 分区表这种对于多节点数据库管理系统的实现途径普及开来。即使 Teradata 在并行上抱持着同样的理念,使得这种理念普及开来的功臣,依旧只能是 Gamma。同时我们必须提及的事情在于,在 Gamma 之前,没有人讨论过 hash-join 算法,因此在这件事情上面,Gamma 对于这一系列算法问世的贡献(同时也有 Kitsuregawa Masaru 本人的功劳),不可以被忘记。

而基本上,所有的数据仓库系统,都使用着 Gamma 风格的架构(Gamma-style architecture)。而其它的,希望使用共享磁盘(shared disk)与共享内存架构(shared memory)的系统,基本都消失了。除非网络的延迟和带宽达到与磁盘相当,否则我希望当前的 shared-nothing 架构,可以一直持续下去。


参考

[1] D. D. Chamberlin. Early history of sql. Annals of the History of Computing, IEEE, 34(4):78–82, 2012.
[2] D. D. Chamberlin and R. F. Boyce. Sequel: A structured english query language. In Proceedings of the 1974 ACM SIGFIDET (now SIGMOD) workshop on Data description, access and control, pages 249–264. ACM, 1974.
[3] C. J. Date. An architecture for high-level language database extensions. In SIGMOD, 1976.
[4] C. J. Date. A critique of the SQL database language. ACM SIGMOD Record, 14(3), Nov. 1984.
[5] D. H. Hansson et al. Ruby on rails. http://www.rubyonrails.org.
[6] M. K. McKusick, K. Bostic, M. J. Karels, and J. S. Quarterman. The design and implementation of the 4.4 BSD operating system. Pearson Education, 1996.
[7] E. Meijer, B. Beckman, and G. Bierman. Linq: reconciling object, relations and XML in the .NET framework. In SIGMOD, 2006.
[8] L. A. Rowe and K. A. Shoens. Data abstraction, views and updates in RIGEL. In SIGMOD, 1979.
[9] J. W. Schmidt. Some high level language constructs for data of type relation. ACM Trans. Database Syst., 2(3), Sept. 1977.
[10] M. Stonebraker. The land sharks are on the squawk box. Communications of the ACM. To appear.
[11] M. Stonebraker, G. Held, E. Wong, and P. Kreps. The design and implementation of ingres. ACM Transactions on Database Systems (TODS), 1(3):189–222, 1976